package com.diaohw.platform.common.enums;

import com.diaohw.platform.common.exception.GlobalException;

import java.util.function.Supplier;

/**
 * @author 刁海文
 * @Remark Response 返回状态枚举类
 * @since 2023/6/11 16:32
 */
public enum CodeMsgEnum {
    /**
     * 成功
     */
    SUCCESS("0", "SUCCESS"),

    /**
     * 成功
     */
    OK("0", "OK"),
    /**
     * 业务上的异常，如表单校验失败等等可使用此枚举
     */
    ERROR("A500", "ERROR"),
    /**
     * 数据参数异常
     */
    DATA("A101", "%s"),

    TENANT("A102", "%s"),
    NETTY("A103", "%s"),
    WEBSOCKET("A104", "Topic: %s, SubscribeId: %s is not online."),
    /**
     * JSON序列化异常
     */
    JSON("A105", "%s"),
    /**
     * 文件
     */
    FILE("A106", "%s"),

    /**
     * 接口请求错误
     */
    URL("A107", "%s"),
    /**
     * 参数序列化异常
     */
    PARAMS("A108", "%s"),

    /**
     * 未登录
     */
    NOT_LOGIN("A301", "请重新登录"),
    /**
     * 无角色
     */
    NOT_ROLE("A302", "%s"),
    /**
     * 无权限
     */
    NOT_PERMISSION("A303", "%s"),
    /**
     * 未通过HTTP认证
     */
    NOT_BASIC_AUTH("A304", "%s"),
    /**
     * saToken 异常
     */
    SA_TOKEN("A305", "%s"),
    /**
     * 算法服务计算异常
     */
    ALGORITHM("A400", "%S"),
    /**
     * 系统运行时产生的异常
     */
    EXCEPTION("A500", "系统异常: %s");


    /**
     * 状态码
     */
    public final String status;

    /**
     * 备注，描述
     */
    public final String describe;

    CodeMsgEnum(String status, String describe) {
        this.status = status;
        this.describe = describe;
    }

    /**
     * 拼接消息
     *
     * @param args 参数
     * @return {@link this#describe :args}
     */
    public String filterAttr(Object... args) {
        return String.format(describe, args);
    }

    /**
     * 创建一个异常对象
     *
     * @return 异常对象
     */
    public GlobalException build() {
        return new GlobalException(this.status, this.describe);
    }

    /**
     * 创建一个异常对象
     *
     * @param msg 详细信息
     * @return 异常对象
     */
    public GlobalException build(Object... msg) {
        return new GlobalException(this.status, filterAttr(msg));
    }


    /**
     * expression 为true时抛出异常
     *
     * @param expression 条件
     * @param message    详细信息
     */
    public void isTrue(boolean expression, Object... message) {
        if (expression) {
            throw new GlobalException(status, filterAttr(message));
        }
    }

    /**
     * expression 为false时抛出异常
     *
     * @param expression 条件
     * @param message    详细信息
     */
    public void isFalse(boolean expression, Object... message) {
        isTrue(!expression, message);
    }

    public Supplier<GlobalException> supplier(Object... message) {
        return () -> build(message);
    }

    /**
     * 抛出一个异常信息
     *
     * @param message 详细信息
     */
    public void throwException(Object... message) {
        throw new GlobalException(status, filterAttr(message));
    }


}
